#include <stdio.h>
#include <stdlib.h>
#include "pila.c"
#include <Windows.h>

// última actualización: 17-5-19, 2:41. FUNCIONANDO TODO

//declaro funciones a utilizar

int col (char c);
void mostrarUnBoom ();
void Color(int Background, int Text);
void mostrarDespedida();
void muestraEncabezado();
void inicioDelPrograma();
void mostrarPalabraAceptada(cadena);
void mostrarPalabraRechazada (cadena);

// inicializo variables

int main()//int argc,char* argv[])
{   //pPila pilaNueva=crearPila();

    inicioDelPrograma();
    int Matriz [6][4] = {
    {1,5,5,5},           // estado 0
    {2,5,5,5},           // estado 1
    {1,3 /*o 4*/,5,5},   // estado 2
    {5,3 /*o 4*/,5,5},   // estado 3
    {5,5,4,5},           // estado 4
    {5,5,5,5}            // estado 5

/*

//sé que la matriz tiene más columnas y filas de las necesarias, pero fue porque corregí la anterior y quedó así.
// la tengo que modificar para dejarla de 5*3
//NOTA: no se porqué se cuelga si achico la matriz.

/*
MATRIZ de Estados para L={a^2n b^n , n>=1}

/*               a       b     fdc
==================================
0) e0,$    | e0,X$ |    -  |    -
1) e0,X    | e1,X$ |    -  |    -
2) e1,X    | e0,XX |  e2,E |    -
3) e2,X    |   -   |  e2,E |    -
4) e2,$    |   -   |    -  |  e3,$
*/

//Estado que acepta la palabra: 4

};


int irAEstado(pPila pila){
    if (esPilaVacia(pila)){
        return 4;
    }
    else {
        return 3;
    }
}

pPila pila;

char cadena[100]="aaabbb";

char seguir = 's';

while (seguir=='s' || seguir=='S'){
    int Estado = 0;
    int i=0;
    muestraEncabezado();
    scanf("%s",&cadena);
    while (cadena[i]&& Estado!=5){
        desapilar(&pila);
        if (cadena[i]=='a'){
            apilar(&pila,'x');
            if (Estado==2){
                apilar(&pila,'x');
            }
        }
        Matriz[2][1]=irAEstado(pila);
        Matriz[3][1]=irAEstado(pila);

        Estado=Matriz[Estado][col(cadena[i])];
        i++;
    }

    if (Estado == 4){
        mostrarPalabraAceptada(cadena);
        } else {
            mostrarPalabraRechazada(cadena);
            }

    while (pila !=NULL){
            desapilar(&pila);
        }
    Color(0,7);
    printf("\n continuar ingresando cadenas de caracteres? (s / n): ");
    scanf("%s",&seguir);

}
mostrarDespedida();
return 0;
}

void inicioDelPrograma (){
        Color(0,15);
    printf("\n ");
    printf("                                AUTOMATA DE PILA \n ");
    printf("\n ");
    printf("                               L={a^2n b^n , n>=1} \n ");

}

void muestraEncabezado(){
    Color(0,7);
    printf("\n ");
    printf("\n Ingresar cadena a evaluar: ");
    Color(0,15);
    }


void mostrarPalabraAceptada(cadena){
        Color(0,10);
        printf(" \n");
        printf("La cadena '%s' pertenece al lenguaje \n", cadena);
        Color(0,15);
}

void mostrarPalabraRechazada (cadena){
        Color(0,12);
        printf(" \n");
        printf("La cadena '%s' NO pertenece al lenguaje \n", cadena);
        mostrarUnBoom();
}

// muestra un "boom" si encuentra una cadena que no pertenece al lenguaje

void mostrarUnBoom(){
    Color(0,12);

    printf(" \n" );
    printf("            \\||||||||// \n" );
    printf("            ==  BOOM  == \n");
    printf("            //||||||||\\ \n" );
    printf(" \n" );
    Color(0,15);

}
// muestra un texto al cerrar el programa

void mostrarDespedida(){
    Color(0,5);

    printf(" \n" );
    printf("                      Sylvina Enriquez \n" );
    printf("                         SSL - 2019 \n");
    printf("                 profesora: Ing. Roxana Leituz \n");
    printf(" \n" );
    Color(0,7);

}



//Hallo el numero de columna que le corresponde a un determinado elemento
// toma un caracter y devuelve un numero

int col (char c){
    if (c=='a'){
        return 0;

    }
    if (c=='b'){
        return 1;
    }

    return 2;
}


// Función para cambiar el color del fondo y/o pantalla

    void Color(int Background, int Text){

 HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); // Tomamos la consola.

 // Para cambiar el color, se utilizan números desde el 0 hasta el 255.
 // Pero, para convertir los colores a un valor adecuado, se realiza el siguiente cálculo.
 int    New_Color= Text + (Background * 16);

 SetConsoleTextAttribute(Console, New_Color); // Guardamos los cambios en la Consola.

}
